/*
 * PlantillaCombo.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 12/12/2009, 11:23:38 AM
 */

package com.ufps.cuatro.modelo.representacion;

import com.ufps.cuatro.util.base.ObjectBase;
import java.io.Serializable;

/**
 * <i><b>PlantillaCombo:</b></i><p>Define la Plantilla que representa el Tipo de Distribución
 * seleccionada para el <code>Componente</code>.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 12/12/2009
 * @see Serializable
 */
public class PlantillaCombo extends ObjectBase{
    private static final long serialVersionUID = 5477314029128579629L;
    
    /**
     * <p>Indica que la <code>PlantillaComponente</code> de cada <code>Componente</code> 
     * incluido en la distribución actual. Implementará el modo de Distribución <code>Automatica</code>.</p>
     * <p>Este modo indica que las <code>PlantillaComponente</code> de los <code>Componente</code>
     * inicialmente se distribuirán de forma automatica definida para la aplicación las
     * distribuciones disponibles son:
     * <ul>
     *  <ol><code>VERTICAL</code></ol>
     *  <ol><code>HORIZONTAL</code></ol>
     *  <ol><code>RECTANGULAR</code></ol>
     * </ul></p>
     */
    public final static int GENERACION_AUTOMATICA = 0;
    /**
     * <p>Indica que la <code>PlantillaComponente</code> de cada <code>Componente</code> 
     * incluido en la distribución actual. Implementará el modo de Distribución <code>Plantilla</code>.</p>
     * <p>Este modo indica que las <code>PlantillaComponente</code> de los <code>Componente</code>
     * inicialmente se distribuirán por medio de una Plantilla previamente definida en un
     * archivo de configuración porporcionado por la aplicación.</p>
     */
    public final static int GENERACION_PLANTILLA = 1;
    /**
     * <p>Indica que la <code>PlantillaComponente</code> de cada <code>Componente</code> 
     * incluido en la distribución actual. Implementará el modo de Distribución <code>Manual</code>.</p>
     * <p>Este modo indica que las <code>PlantillaComponente</code> de los <code>Componente</code>
     * inicialmente no estarán definidas y es responsabilidad del usuario configurarla.</p>
     */
    public final static int GENERACION_MANUAL = 2;

    private String strTitulo;
    private String strId;   
    private boolean global = false;
    private boolean manual = false;
    
    private int ladoHorizontal = 0;
    private int ladoVertical = 0;
    private int generacion;

    /**
     * Constructor por defecto
     */
    public PlantillaCombo() {
        id = 0;        
    }       

    /**
     * Constructor que inicializa las Propiedades Básicas.
     * @param strTitulo Titulo del Tipo de Distribución.
     * @param strId Indice del Tipo de Distribución en <code>String</code>.
     * @param generacion Indica el Modo de Generación para la Distribución actual.
     */
    public PlantillaCombo(String strTitulo, String strId, int generacion) {
        this.strTitulo = strTitulo;
        this.strId = strId;
        this.id = Integer.parseInt(strId);
        this.generacion = generacion;
    }
    
    /**
     * Constructor que inicializa las Propiedades Básicas.
     * @param strTitulo Titulo del Tipo de Distribución.
     * @param id Indice del Tipo de Distribución.
     * @param generacion Indica el Modo de Generación para la Distribución actual.
     */
    public PlantillaCombo(String strTitulo, int id, int generacion) {
        this.strTitulo = strTitulo;
        this.id = id;
        this.strId = String.valueOf(id);
        this.generacion = generacion;
    }

    /**
     * Devuelve el Indice del Tipo de Distribución en <code>String</code>.
     * @return Indice del Tipo de Distribución en <code>String</code>.
     */
    public String getStrId() {
        return strId;
    }

    /**
     * Establece el Indice del Tipo de Distribución en <code>String</code>.
     * @param strId Indice del Tipo de Distribución en <code>String</code>.
     */
    public void setStrId(String strId) {
        this.strId = strId;
    }

    /**
     * Devuelve el Titulo del Tipo de Distribución.
     * @return Titulo del Tipo de Distribución.
     */
    public String getStrTitulo() {
        return strTitulo;
    }

    /**
     * Establece el Titulo del Tipo de Distribución.
     * @param strTitulo Titulo del Tipo de Distribución.
     */
    public void setStrTitulo(String strTitulo) {
        this.strTitulo = strTitulo;
    }

    /**
     * Devuelve el Estado que indica si el Tipo de Distribución se aplica
     * a un ambito o alcance global.
     * @return Estado que indica si el Tipo de Distribución se aplica
     * a un ambito o alcance global.
     */
    public boolean isGlobal() {
        return global;
    }

    /**
     * Establece el Estado que indica si el Tipo de Distribución se aplica
     * a un ambito o alcance global.
     * @param global Estado que indica si el Tipo de Distribución se aplica
     * a un ambito o alcance global.
     */
    public void setGlobal(boolean global) {
        this.global = global;
    }

    /**
     * Devuelve el Estado que indica si el Tipo de Distribución manual ha sido
     * activado.
     * @return Estado que indica si el Tipo de Distribución manual ha sido
     * activado.
     */
    public boolean isManual() {
        return manual;
    }

    /**
     * Establece el Estado que indica si el Tipo de Distribución manual ha sido
     * activado.
     * @param manual Estado que indica si el Tipo de Distribución manual ha sido
     * activado.
     */
    public void setManual(boolean manual) {
        this.manual = manual;
    }

    /**
     * Devuelve el Lado o Tamaño Horizontal que tendrá la Distribución.
     * @return Lado o Tamaño Horizontal que tendrá la Distribución.
     */
    public int getLadoHorizontal() {
        return ladoHorizontal;
    }

    /**
     * Establece el Lado o Tamaño Horizontal que tendrá la Distribución.
     * @param ladoHorizontal Lado o Tamaño Horizontal que tendrá la Distribución.
     */
    public void setLadoHorizontal(int ladoHorizontal) {
        this.ladoHorizontal = ladoHorizontal;
    }

    /**
     * Devuelve el Lado o Tamaño Vertical que tendrá la Distribución.
     * @return Lado o Tamaño Vertical que tendrá la Distribución.
     */
    public int getLadoVertical() {
        return ladoVertical;
    }

    /**
     * Establece el Lado o Tamaño Vertical que tendrá la Distribución.
     * @param ladoVertical Lado o Tamaño Vertical que tendrá la Distribución.
     */
    public void setLadoVertical(int ladoVertical) {
        this.ladoVertical = ladoVertical;
    }

    /**
     * Devuelve el Modo de Generación para la Distribución Actual Representada.
     * @return Modo de Generación para la Distribución Actual Representada.
     * @see #GENERACION_AUTOMATICA
     * @see #GENERACION_MANUAL
     * @see #GENERACION_PLANTILLA
     */
    public int getGeneracion() {
        return generacion;
    }

    /**
     * Establece el Modo de Generación para la Distribución Actual Representada.
     * @param generacion Modo de Generación para la Distribución Actual Representada.
     * @see #GENERACION_AUTOMATICA
     * @see #GENERACION_MANUAL
     * @see #GENERACION_PLANTILLA
     */
    public void setGeneracion(int generacion) {
        this.generacion = generacion;
    }

    @Override
    public String toString() {                    
        return this.strTitulo;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof PlantillaCombo){
            return this.toString().equals(obj.toString());
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        return hash;
    }

    
    
    @Override
    public int compareTo(Object o) {
        try{
            PlantillaCombo obj = (PlantillaCombo) o;
            if(this.id > obj.id)
                return 1;
            else if(this.id < obj.id)
                return -1;
            else
                return 0;
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

    @Override
    public Object clone() {
        PlantillaCombo objClon = null;
        //----------------------------------------------------------
        //Primero se Clona la Referencia Local
        //----------------------------------------------------------
        objClon = (PlantillaCombo) super.clone();        
        //----------------------------------------------------------
        //Ahora se hace la Clonación Profunda
        //----------------------------------------------------------
        if(strId != null){
            ((PlantillaCombo)objClon).strId = new String(strId.toCharArray());
        }
        if(strTitulo != null){
            ((PlantillaCombo)objClon).strTitulo = new String(strTitulo.toCharArray());
        }
        return objClon;
    }   
}